package parser

import (
	"go/format"
	"go/token"
	"strings"
)

// Generator Go代码生成器
type Generator struct {
	fset *token.FileSet
}

// NewGenerator 创建新的生成器
func NewGenerator() *Generator {
	return &Generator{
		fset: token.NewFileSet(),
	}
}

// GenerateFile 生成Go文件
func (g *Generator) GenerateFile(goxFile *GoxFile) ([]byte, error) {
	code := goxFile.GeneratedCode

	// 移除编译忽略指令（这些只应该在.gox.go文件中）
	code = g.removeBuildIgnore(code)

	// 如果代码中包含SQL块，检查是否需要添加必要的导入
	if len(goxFile.SQLBlocks) > 0 {
		// 检查是否使用了fmt.Sprintf，如果是则添加fmt导入
		if strings.Contains(code, "fmt.Sprintf") {
			code = g.addFmtImport(code)
		}

		// 检查是否使用了strings.Join，如果是则添加strings导入
		if strings.Contains(code, "strings.Join") {
			code = g.addStringsImport(code)
		}
	}

	// 使用go/format包格式化生成的代码
	formatted, err := format.Source([]byte(code))
	if err != nil {
		return nil, err
	}

	return formatted, nil
}

// addRuntimeImport 自动添加runtime包导入
func (g *Generator) addRuntimeImport(code string) string {
	lines := strings.Split(code, "\n")
	var result []string
	var inImport bool
	var hasRuntimeImport bool

	for i, line := range lines {
		trimmed := strings.TrimSpace(line)

		// 检查是否已经有runtime导入
		if strings.Contains(line, "github.com/yourusername/gox/pkg/runtime") {
			hasRuntimeImport = true
		}

		// 检查import块
		if strings.HasPrefix(trimmed, "import") {
			inImport = true
			result = append(result, line)

			// 如果是单行导入，需要转换为多行
			if !strings.HasSuffix(trimmed, "(") {
				// 单行import，需要插入runtime导入
				if !hasRuntimeImport {
					result = append(result, `	"github.com/yourusername/gox/pkg/runtime"`)
				}
			}
		} else if inImport && strings.Contains(line, ")") {
			// import块结束，如果还没有添加runtime导入，现在添加
			if !hasRuntimeImport {
				result = append(result, `	"github.com/yourusername/gox/pkg/runtime"`)
			}
			result = append(result, line)
			inImport = false
		} else if inImport && strings.Contains(trimmed, `"`) {
			// 在import块中，添加runtime导入
			result = append(result, line)
			if !hasRuntimeImport && i+1 < len(lines) && strings.Contains(lines[i+1], ")") {
				result = append(result, `	"github.com/yourusername/gox/pkg/runtime"`)
				hasRuntimeImport = true
			}
		} else {
			result = append(result, line)
		}
	}

	return strings.Join(result, "\n")
}

// addFmtImport 自动添加fmt包导入
func (g *Generator) addFmtImport(code string) string {
	lines := strings.Split(code, "\n")
	var result []string
	var inImport bool
	var hasFmtImport bool

	for i, line := range lines {
		trimmed := strings.TrimSpace(line)

		// 检查是否已经有fmt导入
		if strings.Contains(line, `"fmt"`) {
			hasFmtImport = true
		}

		// 检查import块
		if strings.HasPrefix(trimmed, "import") {
			inImport = true
			result = append(result, line)

			// 如果是单行导入，需要转换为多行
			if !strings.HasSuffix(trimmed, "(") {
				// 单行import，需要插入fmt导入
				if !hasFmtImport {
					result = append(result, `	"fmt"`)
				}
			}
		} else if inImport && strings.Contains(line, ")") {
			// import块结束，如果还没有添加fmt导入，现在添加
			if !hasFmtImport {
				result = append(result, `	"fmt"`)
			}
			result = append(result, line)
			inImport = false
		} else if inImport && strings.Contains(trimmed, `"`) {
			// 在import块中，添加fmt导入
			result = append(result, line)
			if !hasFmtImport && i+1 < len(lines) && strings.Contains(lines[i+1], ")") {
				result = append(result, `	"fmt"`)
				hasFmtImport = true
			}
		} else {
			result = append(result, line)
		}
	}

	return strings.Join(result, "\n")
}

// addStringsImport 自动添加strings包导入
func (g *Generator) addStringsImport(code string) string {
	lines := strings.Split(code, "\n")
	var result []string
	var inImport bool
	var hasStringsImport bool

	for i, line := range lines {
		trimmed := strings.TrimSpace(line)

		// 检查是否已经有strings导入
		if strings.Contains(line, `"strings"`) {
			hasStringsImport = true
		}

		// 检查import块
		if strings.HasPrefix(trimmed, "import") {
			inImport = true
			result = append(result, line)

			// 如果是单行导入，需要转换为多行
			if !strings.HasSuffix(trimmed, "(") {
				// 单行import，需要插入strings导入
				if !hasStringsImport {
					result = append(result, `	"strings"`)
				}
			}
		} else if inImport && strings.Contains(line, ")") {
			// import块结束，如果还没有添加strings导入，现在添加
			if !hasStringsImport {
				result = append(result, `	"strings"`)
			}
			result = append(result, line)
			inImport = false
		} else if inImport && strings.Contains(trimmed, `"`) {
			// 在import块中，添加strings导入
			result = append(result, line)
			if !hasStringsImport && i+1 < len(lines) && strings.Contains(lines[i+1], ")") {
				result = append(result, `	"strings"`)
				hasStringsImport = true
			}
		} else {
			result = append(result, line)
		}
	}

	return strings.Join(result, "\n")
}

// removeBuildIgnore 移除编译忽略指令
func (g *Generator) removeBuildIgnore(code string) string {
	lines := strings.Split(code, "\n")
	var result []string

	for _, line := range lines {
		trimmed := strings.TrimSpace(line)
		// 跳过编译忽略指令
		if strings.HasPrefix(trimmed, "//go:build ignore") ||
			strings.HasPrefix(trimmed, "// +build ignore") {
			continue
		}
		result = append(result, line)
	}

	return strings.Join(result, "\n")
}
